Serwer DNScache z djbdns
Napisał: Patryk Krawaczyński
21/08/2009 w Bezpieczeństwo 1 komentarz. (artykuł nr 133, ilość słów: 1083)
D
jbdns jest zestawem programów, który uważany jest za bardzo bezpieczny do obsługi usług DNS (posiadają bardzo wysoką odporność na ataki DNS Amplification oraz Cache Poisoing). Programy te – autorstwa Daniela Julius’a Bernstein’a (znanego wcześniej z autorstwa programu Qmail) powstały w odpowiedzi na wiele błędów, niedociągnięć i luk odkrytych w programie BIND.
Oprócz standardowych programów do obsługi zapytań DNS w skład zestawu wchodzą: tinydns (autorytatywny serwer DNS), dnscache (serwer cache’ujący wpisy DNS), axfrdns (serwer udostępniający strefy do transferu dla zapasowych serwerów DNS). Podana poniżej konfiguracja służy do uruchomienia serwera DNS przechowującego przez pewien czas odpowiedzi z innych serwerów (ang. caching) w celu przyśpieszenia odpowiedzi na zapytania DNS przez maszynę, na której uruchomiony został taki serwer DNS, jak i zapytania maszyn (np. z sieci lokalnej), którym owy serwer DNS został udostępniony. Do instalacji pakietu djbdns (wersja 1.05) wymagany jest zestaw narzędzi do zarządzania usługami – daemontools (wersja 0.76); Interfejs Programu Klient-Serwer Uniksa używający protokołu TCP (ang. UCSPI – UNIX Client-Server Program Interface w wersji 0.88) oraz otwarty port 53 UDP (TCP – jeśli planujemy transfer stref pomiędzy głównym, a zapasowymi serwerami DNS lub obsługę alternatywnych zapytań DNS) w zaporze sieciowej. Pierwszym krokiem jest instalacja zestawu daemontools. Ze względu na konieczność deklarowania extern int errno
z uwzględnieniem pliku errno.h
w systemach Linux (co według autora programów jest sprzeczne z standardem IEEE Std 1003.1-1990 (POSIX)) przed kompilacją każdego programu wymagane jest nałożenie odpowiednich patchy, które usuwają ten błąd. Ponadto w instalacji programów uwzględniono patche autorstwa: Balazs’a Nagy’a (możliwość rozwijania wielu stref niezależnie), Jonathan’a de Boyne’a Pollard’a (poprawa tinydns-data, dnscache, tinydns oraz axfrdns) oraz Lennert’a Buytenhek’a (poprawa wydajności dzięki funkcji mmap() w tinydns). Instalację zestawu zaczynamy od kolekcji programów zarządzających usługami sieciowymi:
mkdir -p /package chmod 1755 /package mv daemontools.tar.gz /package cd /package tar -zxvf daemontools.tar.gz cd /package/admin/daemontools/src patch < /djbdns/daemontools_errnopatch cd .. ./package/install
Po poprawnej instalacji pakietu powinnyśmy zobaczyć odpalony w liście procesów program svscan służący do startowania i monitorowania usług (ps aux | grep svscan):
root 2604 0.0 0.0 1720 372 ? S 17:04 0:00 svscan /service
Oraz wpis dodany do pliku /etc/inittab:
SV:123456:respawn:/command/svscanboot
Uruchamiający program svscan w katalogu /service. Kolejnym krokiem jest instalacja UCSPI-TCP:
tar -zxvf ucspi-tcp.tar.gz cd ucspi-tcp patch < /djbdns/ucspi-tcp_errnopatch patch < /djbdns/ucspi-tcp-periplimitpatch make make setup check
Ostatecznie przechodzimy do instalacji rdzennych programów naszego serwera DNS (kolejność aplikowania patchy jest bardzo ważna, ponieważ zostały one tak ułożone i zmodyfikowane by nie zakłócały swojego, wzajemnego działania):
tar -zxvf djbdns.tar.gz cd djbdns patch < /djbdns/djbdns_errnopatch lub: echo gcc -O2 -include /usr/include/errno.h > conf-cc patch < /djbdns/djbdns_temppatch patch < /djbdns/djbdns_mdnsdatapatch patch < /djbdns/djbdns_datasepatch patch < /djbdns/djbdns_cnamepatch patch < /djbdns/djbdns_aliaspatch patch < /djbdns/djbdns_fmmappatch patch < /djbdns/djbdns_dnsnamexpatch patch < /djbdns/djbdns_forwardpatch patch < /djbdns/djbdns_spacepatch make make setup check
Poprawny proces instalacji powinien ukazać nam następujące komunikaty na wyjściu:
./install ./instcheck
Oraz zainstalować djbdns wraz z wszystkimi narzędziami do /usr/local/bin. Przed właściwą konfiguracją dnscache należy dodać odpowiednich użytkowników do systemu z prawami których będą odpalane poszczególne serwery:
useradd -s /sbin/nologin -d /dev/null tinydns useradd -s /sbin/nologin -d /dev/null dnslog useradd -s /sbin/nologin -d /etc/syncdns syncdns useradd -s /sbin/nologin -d /dev/null dnscache passwd -l tinydns dnslog syncdns dnscache
Na końcu należy zadbać o przeprowadzenie aktualizacji pliku /etc/dnsroots.global z rzeczywistym stanem głównych serwerów DNS:
mv /etc/dnsroots.global /etc/dnsroots.global.old dnsip `dnsqr ns . | awk '/answer:/ { print $5; }' | sort` > /etc/dnsroots.global
Na tym etapie skonfigurujemy dnscache jako cachujący serwer nazw, który będzie odpowiadał na zapytania DNS upoważnionym hostom. Istnieją dwa typy serwerów cachujących: wewnętrzne i zewnętrzne. Wewnętrzny serwer nazw jest po prostu serwerem działającym na adresie lokalnego komputera – 127.0.0.1 lub odpowiadającej mu nazwie mnemonicznej – localhost i wykorzystywanym jedynie przez niego. Zewnętrzny serwer nazw jest ulokowany na publicznym adresie IP, do którego posiadają dostęp zewnętrzne maszyny wykorzystujące go do zapytań DNS. Poniżej zostaną przedstawione obydwa scenariusze konfiguracji wewnętrznego i zewnętrznego serwera DNS:
mkdir /var/lib/svscan dnscache-conf dnscache dnslog /var/lib/svscan/dnscache 127.0.0.1 cd /var/lib/svscan/dnscache dd if=/dev/random of=seed bs=128 count=1 ln -s /var/lib/svscan/dnscache /service
Po wydaniu powyższych poleceń nasz wewnętrzny serwer DNS powinien być gotowy, a polecenie: ps aux | grep dnscache powinno zwrócić wynik:
root 3048 0.0 0.0 1556 320 ? S 20:07 0:00 supervise dnscache dnscache 3050 0.0 0.1 2988 1588 ? S 20:07 0:00 /usr/local/bin/dnscache root 3057 0.0 0.0 2096 776 pts/0 R+ 20:09 0:00 grep dnscache
Aby skorzystać z naszego serwera DNS wystarczy dodać jego adres do pliku konfiguracyjnego obsługi nazw (resolver’a):
echo 'nameserver 127.0.0.1' > /etc/resolv.conf
Kilkoma poleceniami możemy sprawdzić działanie naszego serwera nazw:
dnsq a www.google.com 198.41.0.4 dnsip www.google.com dnsmx google.com ping www.google.com tail -f /service/dnscache/log/main/current
Zewnętrzny serwer DNS, który będzie świadczył usługi dla naszej sieci LAN (np. 192.168.0.0) skonfigurujemy poprzez polecenia:
dnscache-conf dnscache dnslog /var/lib/svscan/dns2cache 192.168.0.1 cd /var/lib/svscan/dns2cache dd if=/dev/random of=seed bs=128 count=1 touch /var/lib/svscan/dns2cache/root/ip/192.168.0 ln -s /var/lib/svscan/dns2cache /service
W powyższych poleceniach została użyta nazwa katalogu dns2cache, ze względu na fakt, iż dnscache jest już zajęta poprzez wewnętrzny serwer. Gdy planujemy operować tylko jednych serwerem, wówczas nazwa katalogu nie jest tak istotna. Polecenie tworzące pusty plik 192.168.0 dodaje uprawnione komputery znajdujące się w tej klasie sieci do korzystania z naszego serwera DNS. Standardowo pojemność pamięci cache ustawiona jest na 100000 bajtów – w przybliżeniu 1 MB. Po osiągnięciu tej granicy pamięć ta zostanie automatycznie wyczyszczona. Jeśli pragniemy zwiększyć ten limit np. do 10 MB, co powinno w zupełności wystarczyć dla małej firmy z dostępem do poczty i WWW poprzez łącze 512 KB/s należy wydać komendy:
echo 10000000 > /service/dnscache/env/CACHESIZE echo 12000000 > /service/dnscache/env/DATALIMIT
Opcja DATALIMIT jest zabezpieczeniem “w razie wypadku”, gdyby w nieprzewidziany sposób pojawił się błąd powodujący niekontrolowany rozrost pamięci cache. Dlatego wielkość określana w tej opcji powinna być zawsze trochę większa od ustalonej wielkości pamięci cache. Po modyfikacji wielkości pamięci najlepiej ją wyczyścić poprzez polecenie:
svc -t /service/dnscache (resetuje pamięć wewnętrznego serwera DNS) svc -t /service/dns2cache (resetuje pamięć zewnętrznego serwera DNS)
Bonus:Istnieje również możliwość przekazania wszystkich zapytań DNS do serwerów OpenDNS. Wówczas nasz serwer cacheDNS zapamięta wyniki pytań z serwerów OpenDNS w pamięci podręcznej. Na późniejsze pytania o ten sam adres IP, odpowiedzi będą już podawane z pamięci podręcznej bez potrzeby czekania aż odpowiedz przyjdzie z serwerów OpenDNS. By uzyskać następujący efekt należy wykonać polecenia:
echo 1 > /etc/dnscache/env/FORWARDONLY echo 208.67.220.220 > /etc/dnscache/root/servers/@ echo 208.67.222.222 >> /etc/dnscache/root/servers/@ svc -t /service/dnscache
Przekazywanie zapytań DNS do serwerów OpenDNS dla zewnętrznego serwera DNS przeprowadza się w ten sam sposób.
Więcej informacji: DNS, djbDNS Home, djbDNS Rocks, Life With djbDNS, Tiny DNS OpenDNS
W dystrybucji Debian Lenny instalacja serwera
djbdns
ogranicza się do wydania poleceń: